package projeto.lp2.grupo6.logica;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Aluno: 
 *      Guilherme Monteiro 
 * 	Italo Guedes 
 * 	Tiago Leite
 * 
 * @author guilhermemg
 * @author tiagoln
 * @author italogas
 * 
 * Classe utilizada para representar uma recomendacao generica de estabelecimentos.
 */
public abstract class Recomendacao {

    private List<Usuario> listaUsuarios;

    /**
     * Construtor de Recomendacao.
     * 
     * @param listaUsuariosRecebida
     * @throws Exception
     */
    public Recomendacao(List<Usuario> listaUsuariosRecebida) throws Exception {
        if (listaUsuariosRecebida == null) {
            throw new Exception("Erro em lista de usuarios nula");
        }
        if (listaUsuariosRecebida.isEmpty()) {
            throw new Exception("Erro em lista de usuarios vazia");
        }
        Iterator<Usuario> it = listaUsuariosRecebida.iterator();
        while (it.hasNext()) {
            if (it.next() == null) {
                throw new Exception("Erro em usuario nulo na lista de usuarios");
            }
        }
        setListaUsuarios(listaUsuariosRecebida);
    }

    /**
     * Atribui uma lista de usuarios em cima
     * da qual vai ser gerada a recomendacao.
     * 
     * @param listaUsuarios
     * @throws Exception
     */
    public void setListaUsuarios(List<Usuario> listaUsuarios) throws Exception {
        if (listaUsuarios == null) {
            throw new Exception("Erro em lista de usuarios nulo");
        }
        if (listaUsuarios.isEmpty()) {
            throw new Exception("Erro em lista de usuarios vazia");
        }
        this.listaUsuarios = new ArrayList<Usuario>(listaUsuarios);
    }

    /**
     * Retorna a lista de usuarios em cima da qual
     * vai ser gerada a recomendacao.
     * 
     * @return lista de usuarios
     */
    public List<Usuario> getListaUsuarios() {
        return listaUsuarios;
    }

    /**
     * Retorna uma lista de estabelecimentos
     * recomendados.
     * 
     * @param quantidadeItens
     * @param filtroTipo
     * @param palavraChave
     * @return lista de estabelecimentos
     * @throws Exception
     */
    public abstract List<Estabelecimento> getRecomendacao(int quantidadeItens, List<TipoDeAlmocoServido> filtroTipo,
            String palavraChave) throws Exception;
}
